/**
 * 页面元素查询
 * @file src\scripts\utils\query-elements.js
 * @author Verning Aulence
 * @date 2024-09-15 17:27:26
 * @description 页面元素单个或多个的查询
 **/

/**
 * 元素选择器函数的参数处理
 * @param {Element} fromEle 元素 DOM
 * @param {Object} argObj JS 普通函数的 arguments 对象
 * @returns {Object}
 * - {Element} firstArg -- 元素DOM
 * - {String} secendArg -- CSS选择器
 */
const processArguments = (fromEle, argObj) => {
  let firstArg = argObj[0];
  let secendArg = argObj[1];

  // 如果参数 1 不是一个 Element 对象，且只有 1 个参数的时候
  if (!(firstArg instanceof Element) && argObj.length === 1) {
    // 将其设置为一个文档对象
    firstArg = document;

    // 创建出第二个参数
    secendArg = fromEle;
  }

  return {
    firstArg,
    secendArg,
  };
};

/**
 * 页面单个元素查询
 * @param {Element} fromEle 从什么元素上开始查询（如果没有设置，程序会默认设置为 document）
 * @param {String} _selector CSS 元素选择器
 * @returns {Element} 查询出的单个元素 DOM
 */
export const qe = function (fromEle, _selector) {
  // 参数处理
  const { firstArg, secendArg } = processArguments(fromEle, arguments);

  // 查询元素
  const ele = firstArg.querySelector(secendArg);

  // 如果查询到了这个元素
  if (ele) {
    return ele;
  } else {
    return null;
  }
};

/**
 * 页面元素集合查询
 * @param {Element} fromEle 从什么元素上开始查询（如果没有设置，程序会默认设置为 document）
 * @param {String} _selector CSS 元素选择器
 * @returns {Element | []} 查询出的元素 NodeList，或者空数组
 */
export const qes = function (fromEle, _selector) {
  // 参数处理
  const { firstArg, secendArg } = processArguments(fromEle, arguments);

  // 查询元素
  const eles = firstArg.querySelectorAll(secendArg);

  // 如果没有查询到元素
  if (eles.length < 1) {
    return [];
  } else {
    return eles;
  }
};

export default {
  qe,
  qes,
};
